#include <malloc.h>/*该文件包含malloc()等函数*/

#define QUEUE_MAX_SIZE 100 // 栈最多支持存放100个数据元素

typedef struct Queue {
    int elements[QUEUE_MAX_SIZE];
    int front;
    int rear;
} Queue;

int init_queue(Queue ** q){
    (*q) = malloc(sizeof(struct Queue));
    if (*q){
        (*q)->front = (*q)->rear = 0;
        return 0;
    }
    else{
        return 1;
    }
}

int enqueue(Queue *q, int value){
    if ((*q).rear - (*q).front == QUEUE_MAX_SIZE) return 1;
    (*q).elements[(*q).rear] = value;
    (*q).rear++;
    return 0;
}

int dequeue(Queue *q, int *value){
    if ((*q).front == (*q).rear) return 1;
    *value = (*q).elements[(*q).front];
    (*q).front = (*q).front + 1;
    return 0;
}

int first(Queue *q, int *value){
    if ((*q).front == (*q).rear) return 1;
    *value = (*q).elements[(*q).front];
    return 0;
}

int isEmpty(Queue *q){
    if ((*q).front == (*q).rear){
        return 0;
    }
    else{
        return 1;
    }
}

int size(Queue *q){
    printf("%d",(*q).rear);
    return (*q).rear - (*q).front;
}

int main() {
    Queue * q;
    int value;

    init_queue(&q);

    for(int i=1; i<=QUEUE_MAX_SIZE; i++) {
        enqueue(q, i);
    }

    printf("队列中应当有 %d 个元素；实际上有 %d 个元素。\n", QUEUE_MAX_SIZE, size(q));

    int res = enqueue(q, 101);
    printf("在已经添加了100个元素以后，再次添加一个元素，返回值应该是1，表示新增元素失败。实际值为:%d\n", res);

    first(q, &value);
    printf("第一个元素值应该是 1；实际上是 %d\n", value);

    for(int i=1; i<=QUEUE_MAX_SIZE; i++) {
        dequeue(q, &value);
        // printf("第%d个元素的值应该是 %d；实际值是: %d\n", i, value);
        printf("第%d个元素的值应该是 %d；实际值是: %d\n", i, i, value);
    }

    if(isEmpty(q) == 0) {
        printf("恭喜！现在队列里没有元素了！\n");
    } else {
        printf("啊！我的代码有问题！\n");
    }
}
